package com.newtest.demos.filter;

import com.alibaba.fastjson.JSONObject;
import com.newtest.demos.pojo.Result;
import com.newtest.demos.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.client.HttpServerErrorException;

import javax.servlet.*;
import javax.servlet.annotation.HttpConstraint;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintWriter;

@Slf4j
@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {


    @Override   //拦截时进行调用，调用多次
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//        获取请求对象和响应对象
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletRequest resp = (HttpServletRequest) request;

//        获取请求url
        String url = req.getRequestURL().toString();
        log.info("请求的url:{}" ,url);

        //判断url中是否包含login，包含表示登录操作，应放行
        if (url.contains("login")) {
            log.info("登录操作，放行");
            chain.doFilter(request,response);
            return;
        }
        if (url.contains("register")) {
            log.info("注册操作，放行");
            chain.doFilter(request,response);
            return;
        }
//        if (url.contains("user/download")) {
//            log.info("注册操作，放行");
//            chain.doFilter(request,response);
//            return;
//        }


        //获取请求头令牌
        String jwt = req.getHeader("token");

        //判断令牌是否存在，如果不存在返回错误结果（未登录）
        if (!StringUtils.hasLength(jwt)){
            log.info("token为空,返回未登录");
            Result error = Result.error(0,"Not_Login");
            //将对象转换成json方式返回
            String notLogin = JSONObject.toJSONString(error);
            // 设置响应内容类型为application/json
            // 输出JSON字符串
            response.getWriter().write(notLogin);
            return;
        }

        //解析token，如果解析失败，返回错误结果（未登录）
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) { //jwt解析失败
            e.printStackTrace();
            log.info("解析令牌失败，返回未登录");
            Result error = Result.error(0,"Not_Login");
            //将对象转换成json方式返回
            String notLogin = JSONObject.toJSONString(error);
            // 设置响应内容类型为application/json
            // 输出JSON字符串
            response.getWriter().write(notLogin);
            return;
        }

        //放行
        log.info("令牌合法，放行");
        chain.doFilter(request,response);

    }


}
